From: robertl Date: Tue, 21 Sep 2010 18:11:38 +0000 (+0000) Subject: Alex York enhances MMO to handle European Edition, Version 5.4.2. X-Git-Tag: archive/raspbian/1.10.0+ds-2+rpi1~1^2~12^2~16^2~7 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=c4a1f6ddede959b6ab2736dbe00e646fffa193cf;p=gpsbabel.git Alex York enhances MMO to handle European Edition, Version 5.4.2. --- diff --git a/mmo.c b/mmo.c index c8d1b4330..d2ac2f77c 100644 --- a/mmo.c +++ b/mmo.c @@ -33,6 +33,8 @@ * 0x12 - most files in my test pool :-) 2008/11/19: Fix routes with a loop but different start and end point 2008/12/12: Fix object release error + 2010/09/10: Added read support for version 0x18 + (test file created by Memory-Map European Edition, Version 5.4.2, Build 1089). */ #include @@ -133,6 +135,12 @@ static const mmo_icon_mapping_t mmo_icon_value_table[] = { { -1, NULL } }; +static const gbuint32 obj_type_ico = 0x00; +static const gbuint32 obj_type_rte = 0x14; +static const gbuint32 obj_type_trk = 0x1E; +static const gbuint32 obj_type_txt = 0x32; +static const gbuint32 obj_type_wpt = 0x3C; + /* helpers */ #ifdef MMO_DBG @@ -250,8 +258,17 @@ mmo_get_object(const gbuint16 objid) mmo_data_t *data; snprintf(key, sizeof(key), "%d", objid | 0x8000); - if (! avltree_find(objects, key, (void *)&data)) + if (! avltree_find(objects, key, (void *)&data)) { +#ifdef MMO_DBG + gbfseek(fin, -2, SEEK_CUR); + int ni, n; + for (ni = 0; (n = gbfgetc(fin)) != EOF; ni++) { + DBG(("mmo_get_object", "%04X %02X %c (%d)\n", + ni, n, n >= 32 && n <= 126 ? (char)n : '.', n)); + } +#endif fatal(MYNAME ": Unregistered object id 0x%04X!\n", objid | 0x8000); + } return data; } @@ -317,6 +334,7 @@ mmo_end_of_route(mmo_data_t *data) rte->line_color.opacity = 255 - (buf[6] * 51); DBG((sobj, "color = 0x%06X\n", rte->line_color.bbggrr)); DBG((sobj, "transparency = %d (-> %d)\n", buf[6], rte->line_color.opacity)); + DBG((sobj, "for \"%s\" \n", data->name)); } if (rte->rte_waypt_ct == 0) { /* don't keep empty routes */ @@ -334,6 +352,7 @@ mmo_read_category(mmo_data_t *data) if (marker & 0x8000) { mmo_data_t *tmp; + DBG(("mmo_read_category", "reading category object\n")); gbfseek(fin, -2, SEEK_CUR); tmp = mmo_read_object(); if (data) data->category = tmp->name; @@ -347,22 +366,41 @@ mmo_read_CObjIcons(mmo_data_t *data) #ifdef MMO_DBG const char *sobj = "CObjIcons"; #endif - int i; + int icon_id; DBG((sobj, ":-----------------------------------------------------\n")); DBG((sobj, "name = \"%s\" [ visible=%s, id=0x%04X ]\n", data->name, data->visible ? "yes" : "NO", data->objid)); - gbfseek(fin, 6, SEEK_CUR); /* skip 6 unknown bytes */ - - while ((i = gbfgetuint32(fin))) { + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X\n", u16)); + + while ((icon_id = gbfgetuint32(fin))) { char *name; (void) gbfgetuint32(fin); (void) gbfgetuint32(fin); name = mmo_readstr(); -// DBG((sobj, "bitmap(%d) = \"%s\"\n", i, name)); - mmo_register_icon(i, name); + DBG((sobj, "bitmap(0x%08X) = \"%s\"\n", icon_id, name)); + mmo_register_icon(icon_id, name); xfree(name); + // The next four bytes hold the length of the image, + // read them and then skip the image data. gbfseek(fin, gbfgetuint32(fin), SEEK_CUR); } } @@ -393,6 +431,18 @@ mmo_read_CObjWaypoint(mmo_data_t *data) if (! time) time = data->ctime; if (time > 0) wpt->creation_time = time; + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + wpt->latitude = gbfgetdbl(fin); wpt->longitude = gbfgetdbl(fin); @@ -447,6 +497,11 @@ mmo_read_CObjWaypoint(mmo_data_t *data) wpt->wpt_flags.icon_descr_is_dynamic = 1; DBG((sobj, "icon = \"%s\"\n", wpt->icon_descr)); } +#ifdef MMO_DBG + else { + DBG((sobj, "icon not found for 0x%08X\n", i)); + } +#endif } wpt->proximity = le_read_float(&buf[4]); @@ -492,6 +547,18 @@ mmo_read_CObjRoute(mmo_data_t *data) rte->rte_name = xstrdup(data->name); route_add_head(rte); + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + ux = gbfgetc(fin); /* line label */ DBG((sobj, "line label = %d\n", ux)); @@ -509,6 +576,7 @@ mmo_read_CObjRoute(mmo_data_t *data) while (data->left > 0) { mmo_data_t *tmp; + DBG((sobj, "read next waypoint\n")); tmp = mmo_read_object(); if (tmp && tmp->data && (tmp->type = wptdata)) { waypoint *wpt; @@ -549,6 +617,18 @@ mmo_read_CObjTrack(mmo_data_t *data) trk->rte_name = xstrdup(data->name); track_add_head(trk); + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + tp = gbfgetint16(fin); DBG((sobj, "track has %d point(s)\n", tp)); @@ -560,7 +640,9 @@ mmo_read_CObjTrack(mmo_data_t *data) wpt->latitude = gbfgetdbl(fin); wpt->longitude = gbfgetdbl(fin); + DBG((sobj, "coordinates = %f / %f\n", wpt->latitude, wpt->longitude)); unk = gbfgetc(fin); + DBG((sobj, "Unknown = 0x%02X (%d)\n", unk, unk)); wpt->creation_time = gbfgetint32(fin); wpt->altitude = gbfgetflt(fin); @@ -568,11 +650,11 @@ mmo_read_CObjTrack(mmo_data_t *data) if (unk != 0) { gbuint16 ux; ux = gbfgetuint16(fin); - DBG((sobj, "u16 = %04X (%d)\n", ux, ux)); + DBG((sobj, "unknown value = 0x%04X (%d)\n", ux, ux)); if (unk > 1) { gbuint16 ux; ux = gbfgetuint16(fin); - DBG((sobj, "u16 = %04X (%d)\n", ux, ux)); + DBG((sobj, "unknown value = 0x%04X (%d)\n", ux, ux)); } } track_add_wpt(trk, wpt); @@ -584,15 +666,15 @@ mmo_read_CObjTrack(mmo_data_t *data) u32 = gbfgetuint32(fin); /* Min. update interval */ DBG((sobj, "min. update interval = %d\n", u32)); u32 = gbfgetuint32(fin); /* unknown */ -// DBG((sobj, "unknown value = 0x%8X (%d)\n", u32, u32)); + DBG((sobj, "unknown value = 0x%08X (%d)\n", u32, u32)); u32 = gbfgetuint32(fin); /* unknown */ -// DBG((sobj, "unknown value = 0x%8X (%d)\n", u32, u32)); + DBG((sobj, "unknown value = 0x%08X (%d)\n", u32, u32)); u32 = gbfgetuint32(fin); /* unknown */ DBG((sobj, "min. update distance = %d\n", u32)); u32 = gbfgetuint32(fin); /* unknown */ DBG((sobj, "track partition interval = %d\n", u32 / 60)); u32 = gbfgetuint32(fin); /* unknown */ -// DBG((sobj, "unknown value = 0x%8X (%d)\n", u32, u32)); + DBG((sobj, "unknown value = 0x%08X (%d)\n", u32, u32)); u32 = gbfgetuint32(fin); /* unknown */ DBG((sobj, "tick interval = %d\n", u32 / 60)); trk->line_color.bbggrr = gbfgetuint32(fin); /* rgb color */ @@ -616,11 +698,11 @@ mmo_read_CObjTrack(mmo_data_t *data) gbuint16 u16; u8 = gbfgetc(fin); -// DBG((sobj, "u8 = 0x%X (since 0x16)\n", u8)); + DBG((sobj, "unknown value = 0x%02X (since 0x16)\n", u8)); u16 = gbfgetuint16(fin); -// DBG((sobj, "u16 = 0x%X (since 0x16)\n", u16)); + DBG((sobj, "unknown value = 0x%04X (since 0x16)\n", u16)); u16 = gbfgetuint16(fin); -// DBG((sobj, "u16 = 0x%X (since 0x16)\n", u16)); + DBG((sobj, "unknown value = 0x%04X (since 0x16)\n", u16)); } } @@ -699,9 +781,14 @@ mmo_read_object(void) int objid; mmo_data_t *data = NULL; + // There are three cases: + // a new object of a type that has not occurred previously in this file; + // a new object; or + // a back reference to an object that appears earlier in the file. + objid = gbfgetuint16(fin); - DBG(("mmo_read_object", "objid = 0x%04X\n", objid)); if (objid == 0xFFFF) { + DBG(("mmo_read_object", "Registering new object type\n")); gbuint16 version; char *sobj; int len; @@ -716,6 +803,7 @@ mmo_read_object(void) sobj = xmalloc(len + 1); sobj[len] = '\0'; gbfread(sobj, len, 1, fin); + DBG(("mmo_read_object", "%s\n", sobj)); if (strcmp(sobj, "CObjIcons") == 0) ico_object_id = objid; else if (strcmp(sobj, "CCategory") == 0) cat_object_id = objid; @@ -729,8 +817,9 @@ mmo_read_object(void) xfree(sobj); } - if (objid & 0x8000) { + DBG(("mmo_read_object", "objid = 0x%04X\n", objid)); + if (objid & 0x8000) { data = mmo_register_object(mmo_object_id++, NULL, 0); data->name = mmo_readstr(); @@ -739,10 +828,25 @@ mmo_read_object(void) data->mtime = gbfgetuint32(fin); data->locked = gbfgetc(fin); data->visible = gbfgetc(fin); - (void) gbfgetuint16(fin); - (void) gbfgetuint16(fin); - + + gbuint32 obj_type; + obj_type = gbfgetuint32(fin); +#ifdef MMO_DBG + gbuint32 expected_type = 0xFFFFFFFF; + if (objid == ico_object_id) expected_type = obj_type_ico; + else if (objid == trk_object_id) expected_type = obj_type_trk; + else if (objid == wpt_object_id) expected_type = obj_type_wpt; + else if (objid == rte_object_id) expected_type = obj_type_rte; + else if (objid == txt_object_id) expected_type = obj_type_txt; + if (mmo_version >= 0x18) expected_type <<= 24; + DBG(("mmo_read_object", "object type = 0x%08X\n", obj_type)); + if (obj_type != expected_type) + DBG(("mmo_read_object", " expected 0x%08X\n", expected_type)); +#endif + if (objid != ico_object_id) mmo_read_category(data); + DBG(("mmo_read_object", "Category : %s\n", + data->category ? data->category : "[No category]")); } if (objid == cat_object_id) ; /* do nothing */ @@ -864,7 +968,7 @@ mmo_read(void) DBG((sobj, "number of objects = %d\n", mmo_obj_ct)); i = gbfgetuint16(fin); - if (i != 0xFFFF) fatal(MYNAME ": Marker not equel to 0xFFFF!\n"); + if (i != 0xFFFF) fatal(MYNAME ": Marker not equal to 0xFFFF!\n"); mmo_version = gbfgetuint16(fin); DBG((sobj, "version = 0x%02X\n", mmo_version)); @@ -944,7 +1048,8 @@ mmo_write_obj_mark(const char *sobj, const char *name) mmo_object_id++; snprintf(buf, sizeof(buf), "%u", mmo_object_id); - DBG(("write", "object \"%s\" registered (id = 0x%04X)\n", name, mmo_object_id)); + DBG(("write", "object \"%s\", registered type \"%s\" (id = 0x%04X)\n", + name, sobj, mmo_object_id)); avltree_insert(mmobjects, sobj, xstrdup(buf)); @@ -980,7 +1085,7 @@ mmo_write_category(const char *sobj, const char *name) static int mmo_write_obj_head(const char *sobj, const char *name, const time_t ctime, - const gpsdata_type type) + const gbuint32 obj_type) { int res; @@ -992,13 +1097,7 @@ mmo_write_obj_head(const char *sobj, const char *name, const time_t ctime, gbfputc(*opt_locked, fout); gbfputc(*opt_visible, fout); - switch(type) { - case trkdata: gbfputuint16(0x1E, fout); break; - case wptdata: gbfputuint16(0x3C, fout); break; - case rtedata: gbfputuint16(0x14, fout); break; - default: gbfputuint16(type, fout); break; - } - gbfputuint16(0x00, fout); + gbfputuint32(obj_type, fout); return res; } @@ -1032,7 +1131,7 @@ mmo_write_wpt_cb(const waypoint *wpt) DBG(("write", "waypoint \"%s\"\n", wpt->shortname ? wpt->shortname : "Mark")); objid = mmo_write_obj_head("CObjWaypoint", - (wpt->shortname && *wpt->shortname) ? wpt->shortname : "Mark", time, wptdata); + (wpt->shortname && *wpt->shortname) ? wpt->shortname : "Mark", time, obj_type_wpt); data = mmo_register_object(objid, wpt, wptdata); data->refct = 1; mmo_write_category("CCategory", (mmo_datatype == rtedata) ? "Waypoints" : "Marks"); @@ -1115,7 +1214,7 @@ mmo_write_rte_head_cb(const route_head *rte) if (time == 0x7FFFFFFF) time = gpsbabel_time; objid = mmo_write_obj_head("CObjRoute", - (rte->rte_name && *rte->rte_name) ? rte->rte_name : "Route", time, rtedata); + (rte->rte_name && *rte->rte_name) ? rte->rte_name : "Route", time, obj_type_rte); mmo_register_object(objid, rte, rtedata); mmo_write_category("CCategory", "Route"); gbfputc(0, fout); /* unknown */ @@ -1163,7 +1262,7 @@ mmo_write_trk_head_cb(const route_head *trk) if (trk->rte_waypt_ct <= 0) return; objid = mmo_write_obj_head("CObjTrack", - (trk->rte_name && *trk->rte_name) ? trk->rte_name : "Track", gpsbabel_time, trkdata); + (trk->rte_name && *trk->rte_name) ? trk->rte_name : "Track", gpsbabel_time, obj_type_trk); mmo_write_category("CCategory", "Track"); gbfputuint16(trk->rte_waypt_ct, fout); @@ -1252,7 +1351,7 @@ mmo_write(void) gbfputuint16(mmo_obj_ct, fout); - mmo_write_obj_head("CObjIcons", "Unnamed object", gpsbabel_time, 0); + mmo_write_obj_head("CObjIcons", "Unnamed object", gpsbabel_time, obj_type_ico); for (i = 0; i < 5; i++) gbfputuint16(0, fout); mmo_datatype = wptdata; diff --git a/reference/memory-map_v24.mmo b/reference/memory-map_v24.mmo new file mode 100644 index 000000000..e69c4cea7 Binary files /dev/null and b/reference/memory-map_v24.mmo differ diff --git a/reference/memory-map_v24~mmo.gpx b/reference/memory-map_v24~mmo.gpx new file mode 100644 index 000000000..9613bce2b --- /dev/null +++ b/reference/memory-map_v24~mmo.gpx @@ -0,0 +1,2781 @@ + + + + + + Uttoxeter to Dimmingsdale + + + Uttoxeter Travelodge + SampleIcon + + + + WP0102 + Dot + + + + WP0103 + Dot + + + + WP0104 + Dot + + + + WP0105 + Dot + + + + WP0106 + Dot + + + + WP0107 + Dot + + + + WP0108 + Dot + + + + WP0109 + Dot + + + + WP0110 + Dot + + + + WP0111 + Dot + + + + WP0112 + Dot + + + + WP0113 + Dot + + + + WP0114 + Dot + + + + WP0115 + Dot + + + + WP0116 + Dot + + + + WP0117 + Dot + + + + WP0118 + Dot + + + + WP0119 + Dot + + + + WP0120 + Dot + + + + WP0121 + Dot + + + + WP0122 + Dot + + + + WP0123 + Dot + + + + WP0124 + Dot + + + + WP0125 + Dot + + + + WP0126 + Dot + + + + WP0127 + Dot + + + + WP0128 + Dot + + + + WP0129 + Dot + + + + WP0130 + Dot + + + + WP0131 + Dot + + + + WP0132 + Dot + + + + WP0133 + Dot + + + + WP0134 + Dot + + + + WP0135 + Dot + + + + WP0136 + Dot + + + + WP0137 + Dot + + + + WP0138 + Dot + + + + WP0139 + Dot + + + + WP0140 + Dot + + + + WP0141 + Dot + + + + WP0142 + Dot + + + + WP0143 + Dot + + + + WP0144 + Dot + + + + WP0145 + Dot + + + + WP0146 + Dot + + + + WP0148 + Dot + + + + WP0149 + Dot + + + + WP0150 + Dot + + + + WP0151 + Dot + + + + WP0152 + Dot + + + + WP0153 + Dot + + + + WP0154 + Dot + + + + WP0179 + Dot + + + + WP0178 + Dot + + + + WP0177 + Dot + + + + WP0176 + Dot + + + + WP0175 + Dot + + + + WP0174 + Dot + + + + WP0173 + Dot + + + + WP0172 + Dot + + + + WP0171 + Dot + + + + WP0170 + Dot + + + + WP0169 + Dot + + + + WP0168 + Dot + + + + WP0167 + Dot + + + + WP0166 + Dot + + + + WP0165 + Dot + + + + WP0164 + Dot + + + + WP0163 + Dot + + + + WP0162 + Dot + + + + WP0161 + Dot + + + + WP0160 + Dot + + + + WP0159 + Dot + + + + WP0158 + Dot + + + + WP0157 + Dot + + + + WP0156 + Dot + + + + WP0155 + Dot + + + + WP00126 + Dot + + + + WP00125 + Dot + + + + WP00124 + Dot + + + + WP00123 + Dot + + + + WP00122 + Dot + + + + WP00121 + Dot + + + + WP00120 + Dot + + + + WP00119 + Dot + + + + WP00118 + Dot + + + + WP00117 + Dot + + + + WP00116 + Dot + + + + WP00115 + Dot + + + + WP00114 + Dot + + + + WP00113 + Dot + + + + WP00112 + Dot + + + + WP00111 + Dot + + + + WP00110 + Dot + + + + WP00109 + Dot + + + + WP00108 + Dot + + + + WP00107 + Dot + + + + WP00106 + Dot + + + + WP00105 + Dot + + + + WP00104 + Dot + + + + WP00103 + Dot + + + + WP00102 + Dot + + + + WP00101 + Dot + + + + WP00100 + Dot + + + + WP0099 + Dot + + + + WP0098 + Dot + + + + WP0097 + Dot + + + + WP0096 + Dot + + + + WP0095 + Dot + + + + WP0094 + Dot + + + + WP0093 + Dot + + + + WP0092 + Dot + + + + WP0091 + Dot + + + + WP0090 + Dot + + + + WP0089 + Dot + + + + WP0088 + Dot + + + + WP0087 + Dot + + + + WP0086 + Dot + + + + WP0085 + Dot + + + + WP0084 + Dot + + + + WP0083 + Dot + + + + WP0082 + Dot + + + + WP0249 + Dot + + + + WP0248 + Dot + + + + WP0147 + Flag + + + + Uttoxeter Link + + + Uttoxeter Station + Flag + + + + WP0002 + Dot + + + + WP0003 + Dot + + + + WP0004 + Dot + + + + WP0005 + Dot + + + + WP0006 + Dot + + + + WP0007 + Dot + + + + WP0008 + Dot + + + + WP0009 + Dot + + + + WP0010 + Dot + + + + WP0011 + Dot + + + + WP0012 + Dot + + + + WP0013 + Dot + + + + WP0014 + Dot + + + + WP0015 + Dot + + + + WP0016 + Dot + + + + WP0017 + Dot + + + + WP0018 + Dot + + + + WP0019 + Dot + + + + WP0020 + Dot + + + + WP0021 + Dot + + + + WP0022 + Dot + + + + WP0023 + Dot + + + + WP0024 + Dot + + + + WP0025 + Dot + + + + WP0026 + Dot + + + + WP0027 + Dot + + + + WP0028 + Dot + + + + WP0029 + Dot + + + + WP0030 + Dot + + + + WP0031 + Dot + + + + WP0032 + Dot + + + + WP0033 + Dot + + + + Uttoxeter Travelodge + SampleIcon + + + + Uttoxeter to Dimmingsdale Track + + + 136.000000 + + + + 138.500000 + + + + 153.000000 + + + + 152.500000 + + + + 145.500000 + + + + 136.500000 + + + + 136.500000 + + + + 133.500000 + + + + 132.500000 + + + + 133.000000 + + + + 132.000000 + + + + 132.500000 + + + + 133.000000 + + + + 136.500000 + + + + 136.000000 + + + + 138.500000 + + + + 138.000000 + + + + 135.500000 + + + + 135.500000 + + + + 134.500000 + + + + 135.000000 + + + + 124.000000 + + + + 135.500000 + + + + 138.500000 + + + + 138.500000 + + + + 136.500000 + + + + 141.500000 + + + + 145.000000 + + + + 142.500000 + + + + 142.000000 + + + + 142.500000 + + + + 143.500000 + + + + 144.500000 + + + + 145.500000 + + + + 143.500000 + + + + 145.000000 + + + + 146.500000 + + + + 145.000000 + + + + 148.500000 + + + + 147.500000 + + + + 149.500000 + + + + 147.000000 + + + + 144.500000 + + + + 141.000000 + + + + 142.500000 + + + + 140.000000 + + + + 145.500000 + + + + 149.500000 + + + + 151.000000 + + + + 151.500000 + + + + 151.500000 + + + + 151.500000 + + + + 147.000000 + + + + 146.000000 + + + + 146.500000 + + + + 147.500000 + + + + 149.000000 + + + + 148.500000 + + + + 148.000000 + + + + 147.500000 + + + + 148.000000 + + + + 147.000000 + + + + 150.000000 + + + + 147.500000 + + + + 145.500000 + + + + 145.000000 + + + + 143.500000 + + + + 142.000000 + + + + 141.000000 + + + + 141.000000 + + + + 141.500000 + + + + 140.500000 + + + + 140.500000 + + + + 139.500000 + + + + 138.500000 + + + + 137.500000 + + + + 137.500000 + + + + 137.500000 + + + + 137.000000 + + + + 137.000000 + + + + 136.500000 + + + + 136.000000 + + + + 135.500000 + + + + 135.000000 + + + + 134.500000 + + + + 135.000000 + + + + 134.500000 + + + + 134.500000 + + + + 134.500000 + + + + 134.500000 + + + + 134.500000 + + + + 134.000000 + + + + 131.500000 + + + + 130.500000 + + + + 131.000000 + + + + 132.500000 + + + + 135.500000 + + + + 137.500000 + + + + 138.500000 + + + + 138.500000 + + + + 138.000000 + + + + 138.000000 + + + + 136.500000 + + + + 134.000000 + + + + 134.000000 + + + + 135.500000 + + + + 135.500000 + + + + 137.000000 + + + + 137.000000 + + + + 137.000000 + + + + 138.000000 + + + + 138.000000 + + + + 138.500000 + + + + 139.500000 + + + + 141.500000 + + + + 141.500000 + + + + 140.500000 + + + + 140.500000 + + + + 141.000000 + + + + 140.500000 + + + + 140.000000 + + + + 140.000000 + + + + 140.000000 + + + + 141.000000 + + + + 140.000000 + + + + 139.000000 + + + + 138.000000 + + + + 138.500000 + + + + 137.500000 + + + + 138.000000 + + + + 138.500000 + + + + 139.500000 + + + + 139.500000 + + + + 142.000000 + + + + 144.500000 + + + + 147.000000 + + + + 146.500000 + + + + 145.000000 + + + + 141.000000 + + + + 140.000000 + + + + 140.500000 + + + + 144.000000 + + + + 143.500000 + + + + 143.000000 + + + + 141.000000 + + + + 140.000000 + + + + 140.000000 + + + + 140.000000 + + + + 141.000000 + + + + 143.500000 + + + + 145.000000 + + + + 148.000000 + + + + 145.000000 + + + + 145.000000 + + + + 144.500000 + + + + 144.000000 + + + + 143.500000 + + + + 143.500000 + + + + 144.500000 + + + + 143.500000 + + + + 140.500000 + + + + 138.500000 + + + + 138.000000 + + + + 138.500000 + + + + 138.500000 + + + + 137.500000 + + + + 138.000000 + + + + 138.500000 + + + + 138.500000 + + + + 139.000000 + + + + 139.000000 + + + + 139.500000 + + + + 139.000000 + + + + 140.000000 + + + + 140.000000 + + + + 141.000000 + + + + 141.500000 + + + + 143.000000 + + + + 143.000000 + + + + 144.000000 + + + + 143.500000 + + + + 143.000000 + + + + 142.500000 + + + + 143.000000 + + + + 143.000000 + + + + 143.000000 + + + + 143.500000 + + + + 144.000000 + + + + 144.000000 + + + + 144.000000 + + + + 144.500000 + + + + 145.000000 + + + + 144.000000 + + + + 144.000000 + + + + 143.500000 + + + + 143.500000 + + + + 144.500000 + + + + 145.000000 + + + + 145.000000 + + + + 145.500000 + + + + 147.000000 + + + + 147.000000 + + + + 147.000000 + + + + 148.000000 + + + + 147.000000 + + + + 146.000000 + + + + 145.000000 + + + + 146.500000 + + + + 151.500000 + + + + 148.500000 + + + + 149.500000 + + + + 148.000000 + + + + 147.500000 + + + + 148.000000 + + + + 148.500000 + + + + 151.000000 + + + + 154.000000 + + + + 158.500000 + + + + 157.500000 + + + + 157.500000 + + + + 154.500000 + + + + 156.500000 + + + + 152.000000 + + + + 148.500000 + + + + 149.000000 + + + + 149.500000 + + + + 151.500000 + + + + 157.500000 + + + + 163.000000 + + + + 170.000000 + + + + 176.500000 + + + + 178.500000 + + + + 175.500000 + + + + 169.500000 + + + + 161.500000 + + + + 157.500000 + + + + 158.000000 + + + + 149.500000 + + + + 140.500000 + + + + 137.500000 + + + + 132.500000 + + + + 128.000000 + + + + 123.000000 + + + + 122.500000 + + + + 125.500000 + + + + 122.500000 + + + + 117.000000 + + + + 105.000000 + + + + 113.000000 + + + + 127.500000 + + + + 130.000000 + + + + 138.500000 + + + + 140.500000 + + + + 149.500000 + + + + 158.500000 + + + + 162.000000 + + + + 167.000000 + + + + 166.500000 + + + + 159.500000 + + + + 135.500000 + + + + 132.500000 + + + + 132.000000 + + + + 138.500000 + + + + 149.000000 + + + + 145.500000 + + + + 145.500000 + + + + 145.500000 + + + + 143.500000 + + + + 141.500000 + + + + 142.000000 + + + + 146.500000 + + + + 143.500000 + + + + 143.000000 + + + + 146.500000 + + + + 152.500000 + + + + 167.500000 + + + + 177.000000 + + + + 182.500000 + + + + 184.000000 + + + + 188.500000 + + + + 185.000000 + + + + 186.500000 + + + + 174.500000 + + + + 172.500000 + + + + 157.000000 + + + + 142.500000 + + + + 119.000000 + + + + 115.500000 + + + + 113.000000 + + + + 126.500000 + + + + 128.500000 + + + + 144.500000 + + + + 146.000000 + + + + 153.000000 + + + + 171.500000 + + + + 178.500000 + + + + 184.500000 + + + + 185.500000 + + + + 181.000000 + + + + 181.500000 + + + + 174.000000 + + + + 137.500000 + + + + 131.000000 + + + + 123.000000 + + + + 145.000000 + + + + 156.000000 + + + + 154.500000 + + + + 151.500000 + + + + 152.500000 + + + + 151.500000 + + + + 151.500000 + + + + 153.000000 + + + + 154.500000 + + + + 150.500000 + + + + 157.000000 + + + + 160.500000 + + + + 162.000000 + + + + 163.000000 + + + + 162.500000 + + + + 164.000000 + + + + 159.500000 + + + + 156.000000 + + + + 156.500000 + + + + 156.000000 + + + + 154.500000 + + + + 153.500000 + + + + 150.500000 + + + + 159.500000 + + + + 166.500000 + + + + 167.500000 + + + + 168.000000 + + + + 165.500000 + + + + 165.500000 + + + + 162.500000 + + + + 159.000000 + + + + 155.500000 + + + + 148.500000 + + + + 152.000000 + + + + 150.500000 + + + + 150.500000 + + + + 152.000000 + + + + 152.500000 + + + + 152.000000 + + + + 151.500000 + + + + 152.500000 + + + + 153.500000 + + + + 149.500000 + + + + 144.000000 + + + + 144.000000 + + + + 139.000000 + + + + 136.000000 + + + + 132.000000 + + + + 127.000000 + + + + 118.500000 + + + + 114.000000 + + + + 108.500000 + + + + 107.500000 + + + + 104.500000 + + + + 94.500000 + + + + 106.500000 + + + + 114.000000 + + + + 121.000000 + + + + 123.000000 + + + + 134.000000 + + + + 147.500000 + + + + 150.000000 + + + + 148.000000 + + + + 140.000000 + + + + 130.000000 + + + + 127.000000 + + + + 119.500000 + + + + 112.000000 + + + + 104.500000 + + + + 98.000000 + + + + 95.500000 + + + + 88.500000 + + + + 95.500000 + + + + 114.500000 + + + + 102.000000 + + + + 94.500000 + + + + 96.500000 + + + + 92.500000 + + + + 94.000000 + + + + 96.000000 + + + + 96.500000 + + + + 106.500000 + + + + 118.000000 + + + + 116.000000 + + + + 115.000000 + + + + 106.000000 + + + + 97.500000 + + + + 93.500000 + + + + 87.500000 + + + + 81.500000 + + + + 77.000000 + + + + 73.500000 + + + + 75.000000 + + + + 75.000000 + + + + 76.000000 + + + + 76.500000 + + + + 77.500000 + + + + 79.000000 + + + + 86.500000 + + + + 94.500000 + + + + 117.500000 + + + + 134.500000 + + + + 165.500000 + + + + 165.000000 + + + + 163.000000 + + + + 167.500000 + + + + 160.000000 + + + + 156.000000 + + + + 154.500000 + + + + 157.500000 + + + + 164.000000 + + + + 166.500000 + + + + 166.000000 + + + + 163.000000 + + + + 160.500000 + + + + 163.500000 + + + + 164.000000 + + + + 161.500000 + + + + 165.000000 + + + + 168.500000 + + + + 171.500000 + + + + 170.500000 + + + + 173.000000 + + + + 178.500000 + + + + 182.000000 + + + + 185.500000 + + + + 186.500000 + + + + 186.000000 + + + + 182.000000 + + + + 186.500000 + + + + 190.500000 + + + + 195.500000 + + + + 200.500000 + + + + 198.500000 + + + + 200.000000 + + + + 203.500000 + + + + 207.000000 + + + + 207.000000 + + + + 205.500000 + + + + 203.000000 + + + + 203.500000 + + + + 199.500000 + + + + 199.000000 + + + + 200.000000 + + + + 196.500000 + + + + 198.500000 + + + + 194.000000 + + + + 191.500000 + + + + 191.000000 + + + + 195.000000 + + + + 193.500000 + + + + 192.500000 + + + + 192.500000 + + + + 191.500000 + + + + 188.500000 + + + + 189.000000 + + + + 187.500000 + + + + 188.500000 + + + + 193.000000 + + + + 205.000000 + + + + 205.500000 + + + + 204.500000 + + + + 204.500000 + + + + 204.000000 + + + + 206.000000 + + + + 207.500000 + + + + 208.000000 + + + + 209.000000 + + + + 207.000000 + + + + 203.500000 + + + + 200.000000 + + + + 200.500000 + + + + 220.500000 + + + + 227.500000 + + + + 243.000000 + + + + 241.000000 + + + + 241.500000 + + + + 240.000000 + + + + 244.500000 + + + + 241.000000 + + + + 233.500000 + + + + 248.000000 + + + + 256.000000 + + + + 251.500000 + + + + 247.000000 + + + + 246.500000 + + + + + diff --git a/testo.d/classic-4.test b/testo.d/classic-4.test index 001534e93..ee463af5a 100755 --- a/testo.d/classic-4.test +++ b/testo.d/classic-4.test @@ -270,9 +270,12 @@ compare ${REFERENCE}/track/tcxtest~gpx-history.tcx ${TMPDIR}/tcxtest~gpx-history # # Memory-Map Navigator overlay files (.mmo) # -# reading +# reading version 22 (0x16) gpsbabel -i mmo -f ${REFERENCE}/memory-map.mmo -o gpx -F ${TMPDIR}/memory-map~mmo.gpx compare ${REFERENCE}/memory-map~mmo.gpx ${TMPDIR}/memory-map~mmo.gpx +# reading version 24 (0x18) +gpsbabel -i mmo -f ${REFERENCE}/memory-map_v24.mmo -o gpx -F ${TMPDIR}/memory-map_v24~mmo.gpx +compare ${REFERENCE}/memory-map_v24~mmo.gpx ${TMPDIR}/memory-map_v24~mmo.gpx #writing (check only for memory leaks) gpsbabel -i gpx -f ${REFERENCE}/memory-map~mmo.gpx -o mmo -F ${TMPDIR}/memory-map~mmo.mmo gpsbabel -i mmo -f ${TMPDIR}/memory-map~mmo.mmo -o gpx -F ${TMPDIR}/memory-map~mmo~gpx.mmo